// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// author: wsfuyibing <websearch@163.com>
// date: 2023-12-10

package base

import (
	cr "crypto/rand"
	eb "encoding/binary"
	"encoding/hex"
	mr "math/rand"
	"sync"
)

var gen = (&generator{}).init()

type generator struct {
	sync.Mutex
	data   int64
	err    error
	random *mr.Rand
}

func (o *generator) convert(bs []byte) string {
	return hex.EncodeToString(bs)
}

func (o *generator) decode(str string) (b []byte) {
	body := make([]byte, len(str)/2)
	if d, de := hex.DecodeString(str); de == nil {
		copy(body[:], d)
	}
	return body
}

func (o *generator) init() *generator {
	o.err = eb.Read(cr.Reader, eb.LittleEndian, &o.data)
	o.random = mr.New(mr.NewSource(o.data))
	return o
}

func (o *generator) make(n int) (b []byte) {
	b = make([]byte, n)
	o.Lock()
	defer o.Unlock()
	o.random.Read(b)
	return
}
